package com.lsfb.signln.Login.Face;

import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.baidu.idl.face.platform.FaceStatusEnum;
import com.baidu.idl.face.platform.ui.FaceLivenessActivity;
import com.baidu.idl.face.platform.ui.utils.VolumeUtils;
import com.lsfb.signln.Index.IndexActivity;
import com.lsfb.signln.Location.TaskMsg.Replenish.Signature.SignatureActivity;
import com.lsfb.signln.Login.Face.exception.FaceError;
import com.lsfb.signln.Login.Face.model.RegResult;
import com.lsfb.signln.Login.Face.utils.OnResultListener;
import com.lsfb.signln.Login.LoginActivity;
import com.lsfb.signln.R;
import com.lsfb.signln.Utils.DefaultDialog;
import com.lsfb.signln.Utils.LittleUtils;
import com.lsfb.signln.Utils.URLString;
import com.zgscwjm.lsfbbasetemplate.Event.EventAnnotation;
import com.zgscwjm.lsfbbasetemplate.Event.LsfbEvent;
import com.zgscwjm.lsfbbasetemplate.internet.BaseInternet;
import com.zgscwjm.lsfbbasetemplate.net.HttpClient;
import com.zgscwjm.lsfbbasetemplate.utils.LsfbLog;
import com.zgscwjm.lsfbbasetemplate.utils.T;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * FirstFaceActivity
 * Created by Administrator on 2018/2/1 0001.
 */

public class FirstFaceActivity extends FaceLivenessActivity {

    private DefaultDialog mDefaultDialog;
    private String bestImagePath;
    private String type;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LsfbEvent.getInstantiation().register2(this);
        type = getIntent().getStringExtra("type");
    }

    @Override
    public void onLivenessCompletion(FaceStatusEnum status, String message, HashMap<String, String> base64ImageMap) {
        super.onLivenessCompletion(status, message, base64ImageMap);
        if (status == FaceStatusEnum.OK && mIsCompletion) {
            // showMessageDialog("活体检测", "检测成功");
            saveImage(base64ImageMap);

//            Intent intent = new Intent();
//            intent.putExtra("file_path", bestImagePath);
//            setResult(Activity.RESULT_OK, intent);
//            finish();
        } else if (status == FaceStatusEnum.Error_DetectTimeout ||
                status == FaceStatusEnum.Error_LivenessTimeout ||
                status == FaceStatusEnum.Error_Timeout) {

            showMessageDialog("活体检测", "采集超时");
        }
    }

    private void saveImage(HashMap<String, String> base64ImageMap) {

        String bestimageBase64 = base64ImageMap.get("bestImage0");
        Bitmap bmp = base64ToBitmap(bestimageBase64);

        // 如果觉的在线校验慢，可以压缩图片的分辨率，目前没有压缩分辨率，压缩质量80%-100%，在neuxs5上大概30k
        try {
            // TODO: 2018/2/1 0001 得到目标文件 
            File file = File.createTempFile(UUID.randomUUID().toString(), ".jpg");
            FileOutputStream outputStream = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);
            outputStream.close();

            bestImagePath = file.getAbsolutePath();
//            reg(bestImagePath);

            List<File> list = new ArrayList<>();
            list.add(file);

            HashMap<String, String> hashMap = new HashMap<>();
            hashMap.put("img", bestImagePath);
            new HttpClient().postFile(URLString.UPLOAD, hashMap, list, new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {

                    LsfbLog.e("上传人脸失败" + e.getMessage());
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    LsfbLog.e("上传人脸success");
                    JSONObject jsonObject = null;
                    try {
                        jsonObject = new JSONObject(response.body().string());
                        LsfbLog.e("上传人脸结果" + jsonObject.toString());
                        if (jsonObject.getInt("code") == 200) {
                            LsfbLog.e("上传人脸得到回调");
                            String img = jsonObject.getString("data");
                            updatefaceimg(img);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });


        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void showMessageDialog(String title, String message) {
        if (mDefaultDialog == null) {
            DefaultDialog.Builder builder = new DefaultDialog.Builder(this);
            builder.setTitle(title).
                    setMessage(message).
                    setNegativeButton("确认",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    mDefaultDialog.dismiss();
//                                    Intent intent = new Intent();
//                                    intent.putExtra("file_path", bestImagePath);
//                                    setResult(Activity.RESULT_OK, intent);
//                                    finish();
                                    // TODO: 2018/2/1 0001 刷新扫描控件
                                    if (mILivenessStrategy != null) {
                                        mILivenessStrategy.reset();
                                    }
                                    VolumeUtils.unRegisterVolumeReceiver(FirstFaceActivity.this, mVolumeReceiver);
                                    mVolumeReceiver = null;
                                    stopPreview();
                                    setVolumeControlStream(AudioManager.STREAM_MUSIC);
                                    mVolumeReceiver = VolumeUtils.registerVolumeReceiver(FirstFaceActivity.this, FirstFaceActivity.this);
                                    if (mTipsTopView != null) {
                                        mTipsTopView.setText(R.string.detect_face_in);
                                    }
                                    startPreview();
                                }
                            });
            mDefaultDialog = builder.create();
            mDefaultDialog.setCancelable(true);
        }
        mDefaultDialog.dismiss();
        mDefaultDialog.show();
    }

    @Override
    public void finish() {
        super.finish();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        LsfbEvent.getInstantiation().unregister2(this);
    }

    /**
     * 上传百度，弃用
     *
     * @param filePath
     */
    private void reg(String filePath) {
//        String username = usernameEt.getText().toString().trim();
//        String password = passwordEt.getText().toString().trim();
//        String confirmPassword = confirmPasswordEt.getText().toString().trim();
        if (TextUtils.isEmpty("laji")) {
            Toast.makeText(FirstFaceActivity.this, "姓名不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
//        if (TextUtils.isEmpty(password)) {
//            Toast.makeText(RegActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show();
//            return;
//        }
//        if (TextUtils.isEmpty(confirmPassword)) {
//            Toast.makeText(RegActivity.this, "确认密码不能为空", Toast.LENGTH_SHORT).show();
//            return;
//        }


        final File file = new File(filePath);
        if (!file.exists()) {
            Toast.makeText(FirstFaceActivity.this, "文件不存在", Toast.LENGTH_LONG).show();
            return;
        }
        // TODO 人脸注册说明 https://aip.baidubce.com/rest/2.0/face/v2/faceset/user/add
        // 模拟注册，先提交信息注册获取uid，再使用人脸+uid到百度人脸库注册，
        // TODO 实际使用中，建议注册放到您的服务端进行（这样可以有效防止ak，sk泄露） 把注册信息包括人脸一次性提交到您的服务端，
        // TODO 注册获得uid，然后uid+人脸调用百度人脸注册接口，进行注册。

        // 每个开发者账号只能创建一个人脸库；
        // 每个人脸库下，用户组（group）数量没有限制；
        // 每个用户组（group）下，可添加最多300000张人脸，如每个uid注册一张人脸，则最多300000个用户uid；
        // 每个用户（uid）所能注册的最大人脸数量没有限制；
        // 说明：人脸注册完毕后，生效时间最长为35s，之后便可以进行识别或认证操作。
        // 说明：注册的人脸，建议为用户正面人脸。
        // 说明：uid在库中已经存在时，对此uid重复注册时，新注册的图片默认会追加到该uid下，如果手动选择action_type:replace，
        // 则会用新图替换库中该uid下所有图片。
        // uid          是	string	用户id（由数字、字母、下划线组成），长度限制128B
        // user_info    是	string	用户资料，长度限制256B
        // group_id	    是	string	用户组id，标识一组用户（由数字、字母、下划线组成），长度限制128B。
        // 如果需要将一个uid注册到多个group下，group_id,需要用多个逗号分隔，每个group_id长度限制为48个英文字符
        // image	    是	string	图像base64编码，每次仅支持单张图片，图片编码后大小不超过10M
        // action_type	否	string	参数包含append、replace。如果为“replace”，则每次注册时进行替换replace（新增或更新）操作，
        // 默认为append操作
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                faceReg(file);
            }
        }, 1000);


    }

    private void faceReg(final File file) {

        // 用户id（由数字、字母、下划线组成），长度限制128B
        // uid为用户的id,百度对uid不做限制和处理，应该与您的帐号系统中的用户id对应。

        final String uid;
        // String uid = 修改为自己用户系统中用户的id;
        // 模拟使用username替代
        final String username = "laji";
        uid = "21";
        new Thread(new Runnable() {
            @Override
            public void run() {

                APIService.getInstance().reg(new OnResultListener<RegResult>() {
                    @Override
                    public void onResult(RegResult result) {
                        Log.e("人脸录入", "orientation->" + result.getJsonRes());
//                T.showShort(FirstFaceActivity.this, "人脸录入成功");
                        startActivity(new Intent(FirstFaceActivity.this, IndexActivity.class));
//                finish();
                    }

                    @Override
                    public void onError(FaceError error) {
//                T.showShort(FirstFaceActivity.this, "人脸录入失败" + error.getMessage().toString());
                        LsfbLog.e("人脸录入失败" + error.getMessage().toString());
                    }
                }, file, uid, username);

            }
        }).start();

    }


    /**
     * 上传图片
     */
    public void updatefaceimg(String bestImagePath) {
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("imgPath", bestImagePath);
        new BaseInternet().getData(URLString.UPDATEFACEIMG, hashMap, String.class, new FirstFaceEvent(), true);
    }

    @EventAnnotation
    public void FirstFaceEvent(FirstFaceEvent event) {
        switch (event.getCode()) {
            case 200:
                T.showShort(this, "人脸信息上传成功");
                if (type.equals("1")) {
                    startActivity(new Intent(FirstFaceActivity.this, SignatureActivity.class).putExtra("type", "1"));
                }
                finish();
                break;
            case 1006:
                T.showShort(this, "您的账号已在其它设备登录，请重登录");
                LittleUtils.exit(this);
                startActivity(new Intent(this, LoginActivity.class));
                break;
            default:
//                T.showShort(this, event.getMsg());
                T.showShort(this, "录入失败，请重试");
                if (mILivenessStrategy != null) {
                    mILivenessStrategy.reset();
                }
                VolumeUtils.unRegisterVolumeReceiver(FirstFaceActivity.this, mVolumeReceiver);
                mVolumeReceiver = null;
                stopPreview();
                setVolumeControlStream(AudioManager.STREAM_MUSIC);
                mVolumeReceiver = VolumeUtils.registerVolumeReceiver(FirstFaceActivity.this, FirstFaceActivity.this);
                if (mTipsTopView != null) {
                    mTipsTopView.setText(R.string.detect_face_in);
                }
                startPreview();
                break;
        }
    }

}